package com.example.jdbc.test;

import com.example.jdbc.DruidUtil;
import org.junit.Test;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class TransactionTest2 {

    /**
     * 张三去银行给朋友汇款,张三卡上有3050元,李四卡上2000元,张三给李四转账50元(无手续费),
     * 如果,张三的钱刚扣,而李四的钱又没加时,网线断了。
     * */
    //使用事务处理的例子：
    @Test
    public void transaction(){
        Connection conn = null;
        Statement statement=null;
        try {
            //获取连接
            conn= DruidUtil.getConn();
            //开启事务
            conn.setAutoCommit(false);
            //获取执行SQL的对象
             statement = conn.createStatement();
            //定义SQL语句
            //张三转50给李四，首先张三的余额减掉50
            String sql1= "UPDATE account SET money=money-50 WHERE id=1";
            //李四的余额应该加50
            String sql2= "UPDATE account SET money=money+50 WHERE id=2";
            //张三转50给李四的操作
            int count = statement.executeUpdate(sql1);
            if (count>0){
                System.out.println("张三的账户已扣掉50");
            }
            //出现异常，程序会终止（模拟断网）
             int i = 3/0;
            //李四账户增加50的操作
            int count2 = statement.executeUpdate(sql2);
            if (count2>0){
                System.out.println("李四的账户已增加50");
            }
            //提交事务
            conn.commit();
        } catch (Exception e) {

                try {
                    if (conn!=null) {
                        //事务回滚到错误之前的状态
                        conn.rollback();
                    }
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }

            e.printStackTrace();
        }

        //释放资源
        DruidUtil.close(conn,statement);




    }
}
